package com.xydtech.web.controller.system;

import com.xydtech.common.annotation.Log;
import com.xydtech.common.config.XydtechBusiPlatConfig;
import com.xydtech.common.constant.UserConstants;
import com.xydtech.common.core.controller.BaseController;
import com.xydtech.common.core.domain.AjaxResult;
import com.xydtech.common.core.domain.entity.SysDept;
import com.xydtech.common.core.domain.entity.SysUser;
import com.xydtech.common.enums.BusinessType;
import com.xydtech.common.utils.AESEncryptionUtils;
import com.xydtech.common.utils.DateUtils;
import com.xydtech.common.utils.ShiroUtils;
import com.xydtech.common.utils.StringUtils;
import com.xydtech.common.utils.file.FileUploadUtils;
import com.xydtech.framework.shiro.service.SysPasswordService;
import com.xydtech.system.service.ISysDeptService;
import com.xydtech.system.service.ISysUserService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

/**
 * 个人信息 业务处理
 *
 * @author xydtech
 */
@Controller
@RequestMapping("/system/user/profile")
public class SysProfileController extends BaseController {
    private static final Logger log = LoggerFactory.getLogger(SysProfileController.class);

    private String prefix = "system/user/profile";

    @Autowired
    private ISysUserService userService;
    @Autowired
    private ISysDeptService sysDeptService;
    @Autowired
    private SysPasswordService passwordService;
    //文件分布式存储开关
    @Value("${busiplat.minioUpload}")
    private boolean minioUpload;

    /**
     * 个人信息
     */
    @GetMapping()
    public String profile(ModelMap mmap) {
        SysUser user = getSysUser();
        String salt = getSalt();//盐值
        try {
            //数据解密（手机号、身份证号）
            if (!StringUtils.objIsNullOrEmpty(user.getPhonenumber())) {
                user.setPhonenumber(AESEncryptionUtils.decrypt(user.getPhonenumber(), salt));
            }
            if (!StringUtils.objIsNullOrEmpty(user.getCardNum())) {
                user.setCardNum(AESEncryptionUtils.decrypt(user.getCardNum(), salt));
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        mmap.put("user", user);
        mmap.put("roleGroup", userService.selectUserRoleGroup(user.getUserId()));
        mmap.put("postGroup", userService.selectUserPostGroup(user.getUserId()));
        return prefix + "/profile";
    }

    @GetMapping("/checkPassword")
    @ResponseBody
    public boolean checkPassword(String password) {
        SysUser user = getSysUser();
        if (passwordService.matches(user, password)) {
            return true;
        }
        return false;
    }

    @GetMapping("/resetPwd")
    public String resetPwd(ModelMap mmap) {
        String salt = getSalt();//盐值
        SysUser user = getSysUser();
        mmap.put("user", userService.selectUserById(user.getUserId(), salt));
        return prefix + "/resetPwd";
    }

    @Log(title = "重置密码", businessType = BusinessType.UPDATE)
    @PostMapping("/resetPwd")
    @ResponseBody
    public AjaxResult resetPwd(String oldPassword, String newPassword) {
        String salt = getSalt();//盐值
        SysUser user = getSysUser();
        if (!passwordService.matches(user, oldPassword)) {
            return error("修改密码失败，旧密码错误");
        }
        if (passwordService.matches(user, newPassword)) {
            return error("新密码不能与旧密码相同");
        }
        user.setSalt(ShiroUtils.randomSalt());
        user.setPassword(passwordService.encryptPassword(user.getLoginName(), newPassword, user.getSalt()));
        user.setPwdUpdateDate(DateUtils.getNowDate());
        if (userService.resetUserPwd(user, salt) > 0) {
            setSysUser(userService.selectUserById(user.getUserId(), salt));
            return success();
        }
        return error("修改密码异常，请联系管理员");
    }

    /**
     * 修改用户
     */
    @GetMapping("/edit")
    public String edit(ModelMap mmap) {
        String salt = getSalt();//盐值
        SysUser user = getSysUser();
        mmap.put("user", userService.selectUserById(user.getUserId(), salt));
        return prefix + "/edit";
    }

    /**
     * 修改头像
     */
    @GetMapping("/avatar")
    public String avatar(ModelMap mmap) {
        String salt = getSalt();//盐值
        SysUser user = getSysUser();
        mmap.put("user", userService.selectUserById(user.getUserId(), salt));
        return prefix + "/avatar";
    }

    /**
     * 修改用户
     */
    @Log(title = "个人信息", businessType = BusinessType.UPDATE)
    @PostMapping("/update")
    @ResponseBody
    public AjaxResult update(SysUser user) {
        String salt = getSalt();//盐值
        SysUser currentUser = getSysUser();
        currentUser.setUserName(user.getUserName());
        currentUser.setEmail(user.getEmail());
        currentUser.setPhonenumber(user.getPhonenumber());
        currentUser.setSex(user.getSex());
        String cardNum = currentUser.getCardNum();
        try {
            //数据解密（手机号、身份证号）
            if (!StringUtils.objIsNullOrEmpty(cardNum)) {
                cardNum = AESEncryptionUtils.decrypt(cardNum, salt);
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        if (StringUtils.isNotEmpty(user.getPhonenumber())
                && UserConstants.USER_PHONE_NOT_UNIQUE.equals(userService.checkPhoneUnique(currentUser, salt))) {
            return error("修改用户'" + currentUser.getLoginName() + "'失败，手机号码已存在");
        } else if (StringUtils.isNotEmpty(user.getEmail())
                && UserConstants.USER_EMAIL_NOT_UNIQUE.equals(userService.checkEmailUnique(currentUser))) {
            return error("修改用户'" + currentUser.getLoginName() + "'失败，邮箱账号已存在");
        }

        currentUser.setPhonenumber(user.getPhonenumber());
        currentUser.setCardNum(cardNum);
        if (userService.updateUserInfo(currentUser, salt) > 0) {
            SysUser sysUser = userService.selectUserById(currentUser.getUserId(), salt);
            try {
                //数据加密（手机号、身份证号）
                if (!StringUtils.objIsNullOrEmpty(sysUser.getPhonenumber())) {
                    sysUser.setPhonenumber(AESEncryptionUtils.encrypt(sysUser.getPhonenumber(), salt));
                }
                if (!StringUtils.objIsNullOrEmpty(sysUser.getCardNum())) {
                    sysUser.setCardNum(AESEncryptionUtils.encrypt(sysUser.getCardNum(), salt));
                }
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
            setSysUser(sysUser);
            return success();
        }
        return error();
    }

    /**
     * 保存头像
     */
    @Log(title = "个人信息", businessType = BusinessType.UPDATE)
    @PostMapping("/updateAvatar")
    @ResponseBody
    public AjaxResult updateAvatar(@RequestParam("avatarfile") MultipartFile file) {
        SysUser currentUser = getSysUser();
        String salt = getSalt();//盐值
        try {
            if (!file.isEmpty()) {
                //当前机构号
                Long deptId = ShiroUtils.getSysUser().getDeptId();
                //根据当前机构查询法人机构
                SysDept dept = sysDeptService.selectSecondLevelDeptByDeptId(deptId);
                if (dept != null) {
                    deptId = dept.getDeptId();
                }
                //路径拼接法人机构号
                String subFilePath = deptId + "/avatar";
                String avatar = FileUploadUtils.upload(XydtechBusiPlatConfig.getUploadPath(subFilePath), file, minioUpload);
                currentUser.setAvatar(avatar);
                if (userService.updateUserInfo(currentUser, salt) > 0) {
                    setSysUser(userService.selectUserById(currentUser.getUserId(), salt));
                    return success();
                }
            }
            return error();
        } catch (Exception e) {
            log.error("修改头像失败！", e);
            return error(e.getMessage());
        }
    }
}
